package services

import (
	"errors"
	"stacks/database"
	"stacks/models"
)

// TenantService 租户服务
type TenantService struct{}

// NewTenantService 创建租户服务实例
func NewTenantService() *TenantService {
	return &TenantService{}
}

// GetTenantByID 根据ID获取租户
func (s *TenantService) GetTenantByID(id uint) (*models.SysTenant, error) {
	var tenant models.SysTenant
	err := database.GetDB().First(&tenant, id).Error
	if err != nil {
		return nil, errors.New("租户不存在")
	}
	return &tenant, nil
}

// GetTenantList 获取租户列表
func (s *TenantService) GetTenantList(page, pageSize int) ([]models.SysTenant, int64, error) {
	var tenants []models.SysTenant
	var total int64

	db := database.GetDB()
	db.Model(&models.SysTenant{}).Count(&total)

	offset := (page - 1) * pageSize
	err := db.Offset(offset).Limit(pageSize).Find(&tenants).Error
	if err != nil {
		return nil, 0, err
	}

	return tenants, total, nil
}

// CreateTenant 创建租户
func (s *TenantService) CreateTenant(tenant *models.SysTenant) error {
	// 检查租户名是否已存在
	var existingTenant models.SysTenant
	err := database.GetDB().Where("name = ?", tenant.Name).First(&existingTenant).Error
	if err == nil {
		return errors.New("租户名已存在")
	}

	return database.GetDB().Create(tenant).Error
}

// UpdateTenant 更新租户
func (s *TenantService) UpdateTenant(id uint, updates map[string]interface{}) error {
	var tenant models.SysTenant
	err := database.GetDB().First(&tenant, id).Error
	if err != nil {
		return errors.New("租户不存在")
	}

	// 检查租户名是否重复
	if name, ok := updates["name"].(string); ok {
		var existingTenant models.SysTenant
		err = database.GetDB().Where("name = ? AND id != ?", name, id).First(&existingTenant).Error
		if err == nil {
			return errors.New("租户名已存在")
		}
	}

	return database.GetDB().Model(&tenant).Updates(updates).Error
}

// DeleteTenant 删除租户
func (s *TenantService) DeleteTenant(id uint) error {
	var tenant models.SysTenant
	err := database.GetDB().First(&tenant, id).Error
	if err != nil {
		return errors.New("租户不存在")
	}

	return database.GetDB().Delete(&tenant).Error
}
